package com.powernode.controller;

import com.powernode.domain.SysMenu;
import com.powernode.service.SysMenuService;
import com.powernode.utils.AuthUtil;
import com.powernode.vo.MenuAndAuth;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 内容:
 * 作者: cy
 * 原本的 后端先写好
 */
@RestController
@Api(tags = "菜单管理")
@RequestMapping("sys/menu")
public class MenuController {

    @Autowired
    private SysMenuService sysMenuService;

    /**
     * 我们是前后端分离的模式
     * 前端的权限怎么处理？？
     * sec:hasAuth()
     * 后端需要返回当前用户的所有的权限信息 前端通用v-if  v-show  控制按钮的显示
     * 这个接口 需要菜单 还需要权限
     * 有层级关系的 数据  树  java 是 list<SysMenu>
     * 权限的集合List<String>
     * ----------------
     * 1.获取当前的用户
     * 2.查询他对应的菜单
     * 3.查询他对应的权限
     * 4.组装数据返回
     *
     * 如果你用 redis    getPrincipal
     * jwt 只有名称和 它的权限集合
     *
     * @return
     */
    @GetMapping("nav")
    @ApiOperation("获取当前用户的菜单和权限")
    public ResponseEntity<MenuAndAuth> getMenuAndAuthBySysUserId() {
        // 获取当前的用户
        Long userId = AuthUtil.getUserIdOrShopId(true);
        // 查询他对应的菜单 缓存 加载菜单
        List<SysMenu> sysMenus = sysMenuService.loadSysUserMenu(userId);
        // 查询权限 合理的利用jwt 会减少查询数据库的次数
        Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext()
                .getAuthentication()
                .getAuthorities();
        // 转成权限集合
        List<String> auths = authorities.stream()
                .map(Object::toString)
                .collect(Collectors.toList());
        // 组装数据返回
        MenuAndAuth menuAndAuth = new MenuAndAuth(sysMenus, auths);
        return ResponseEntity.ok(menuAndAuth);
    }


}
